using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class ChatDeepSeek_Silicon : LLM
{
    // 在 Awake() 中初始化 API 地址和密钥
    private void Awake()
    {
        // ✅ 替换为硅基流动提供的实际 API 地址
        url = "https://api.silicong.cn/v1/chat/completions";  // 设置 API 请求的 URL 地址
        api_key = "sk-lekuspeymcokjfcttrkcjhjopatbrwkzwnhnnydnvatspdzn";  // 使用你的真实 API 密钥
    }

    [SerializeField] private string api_key;  // API 密钥，用于请求身份验证
    public string m_SystemSetting = string.Empty;  // 系统设置（比如模型的系统指令）

    // 模型名称改为硅基的模型名
    public string m_ModelName = "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B";  // 使用的模型名称

    // Start() 在脚本启动时执行
    private void Start()
    {
        // 将系统消息添加到消息列表
        m_DataList.Add(new SendData("system", m_SystemSetting));  // 系统消息通常用于设置模型的角色或行为
    }

    // PostMsg 方法用于发送消息并接收回复
    public override void PostMsg(string _msg, Action<string> _callback)
    {
        // 调用父类的 PostMsg 方法
        base.PostMsg(_msg, _callback);
    }

    // Request 方法用于与 API 进行通信，发送请求并处理响应
    public override IEnumerator Request(string _postWord, Action<string> _callback)
    {
        // 启动计时器，计算请求耗时
        stopwatch.Restart();

        // 检查 API 密钥是否为空
        if (string.IsNullOrEmpty(api_key))
        {
            Debug.LogError("API Key is missing! Please set it in the inspector or constructor.");
            yield break;  // 如果没有 API 密钥，停止执行
        }

        // 使用 UnityWebRequest 发送 POST 请求
        using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
        {
            // 构建要发送的数据体
            PostData _postData = new PostData
            {
                model = m_ModelName,  // 使用指定的模型
                messages = m_DataList,  // 消息内容，包含对话上下文
                stream = false,  // 不开启流式传输
                temperature = 0.7f,  // 模型的采样温度（控制输出的创造性）
                top_p = 0.7f,  // top-p 采样方法的概率阈值
                top_k = 50,  // top-k 采样方法，限制生成的候选词数量
                frequency_penalty = 0.5f,  // 控制重复词汇的惩罚
                max_tokens = 1024,  // 最大输出字符数
                n = 1  // 返回的选择数量
            };

            // 将数据体转换为 JSON 格式
            string _jsonText = JsonUtility.ToJson(_postData);
            byte[] data = System.Text.Encoding.UTF8.GetBytes(_jsonText);

            // 设置请求的上传和下载处理器
            request.uploadHandler = new UploadHandlerRaw(data);  // 上传数据
            request.downloadHandler = new DownloadHandlerBuffer();  // 下载数据

            // 设置请求头
            request.SetRequestHeader("Content-Type", "application/json");  // 请求内容为 JSON
            request.SetRequestHeader("Authorization", $"Bearer {api_key}");  // 添加授权头

            // 发送请求并等待响应
            yield return request.SendWebRequest();

            // 如果请求成功，处理返回的结果
            if (request.result == UnityWebRequest.Result.Success)
            {
                string _msgBack = request.downloadHandler.text;  // 获取响应内容
                MessageBack _textback = JsonUtility.FromJson<MessageBack>(_msgBack);  // 将响应的 JSON 转为对象

                // 如果响应数据有效，获取回复内容并传给回调函数
                if (_textback != null && _textback.choices.Count > 0)
                {
                    string _backMsg = _textback.choices[0].message.content;  // 获取回复内容
                    m_DataList.Add(new SendData("assistant", _backMsg));  // 将回复内容加入消息列表
                    _callback(_backMsg);  // 执行回调，返回回复的消息
                }
            }
            else
            {
                Debug.LogError(request.downloadHandler.text);  // 如果请求失败，打印错误信息
            }

            // 记录并输出请求耗时
            stopwatch.Stop();
            Debug.Log("硅基 DeepSeek 耗时：" + stopwatch.Elapsed.TotalSeconds);
        }
    }

    #region 数据结构

    // 用于构建 POST 请求的参数
    [Serializable]
    public class PostData
    {
        public string model;  // 模型名称
        public List<SendData> messages;  // 消息列表
        public bool stream = false;  // 是否开启流式传输
        public float temperature = 0.7f;  // 采样温度
        public float top_p = 0.7f;  // top-p 采样参数
        public int top_k = 50;  // top-k 采样参数
        public float frequency_penalty = 0.5f;  // 频率惩罚
        public int max_tokens = 1024;  // 最大 token 数
        public int n = 1;  // 返回的回复数量
    }

    // 用于解析 API 返回的数据
    [Serializable]
    public class MessageBack
    {
        public string id;  // 消息 ID
        public int created;  // 创建时间戳
        public string model;  // 使用的模型
        public List<MessageBody> choices;  // 回复选择列表
    }

    // 消息选择体（通常只有一个回复）
    [Serializable]
    public class MessageBody
    {
        public Message message;  // 消息内容
        public string finish_reason;  // 完成原因
        public int index;  // 回复的索引
    }

    // 消息内容结构
    [Serializable]
    public class Message
    {
        public string role;  // 角色（"assistant" 或 "user"）
        public string content;  // 消息内容
    }

    #endregion
}